﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace Itegracion.Framework.Forms
{
    public partial class fmSeleccion : fmProceso
    {
        private ucEdicion propiedades;

        public fmSeleccion()
        {
            InitializeComponent();
        }

        #region Propiedades
        public DataRow Fila
        {
            get
            {
                return (listado.SelectedRows[0].DataBoundItem as DataRowView).Row as DataRow;
            }
        }
        private ModoMantenimiento modo;
        public ModoMantenimiento Modo
        {
            get
            {
                return modo;
            }
            set
            {
                modo = value;
                if (modo == ModoMantenimiento.Listado)
                {
                    paEdicion.Visible = false;
                    paListado.Visible = true;
                    tsbSeleccionar.Enabled = true;
                    tsbNuevo.Enabled = true;
                    tsbEditar.Enabled = true;
                    tsbGuardar.Enabled = false;
                    tsbCancelar.Enabled = true;
                    slFiltrar.Enabled = true;
                    tsbFiltro.Enabled = true;
                    listado.Focus();
                }
                if (modo == ModoMantenimiento.Edicion)
                {
                    paEdicion.Visible = true;
                    paListado.Visible = false;
                    tsbSeleccionar.Enabled = false;
                    tsbNuevo.Enabled = true;
                    tsbEditar.Enabled = false;
                    tsbGuardar.Enabled = true;
                    tsbCancelar.Enabled = true;
                    slFiltrar.Enabled = false;
                    tsbFiltro.Enabled = false;
                }
                if (modo == ModoMantenimiento.Nuevo)
                {
                    paEdicion.Visible = true;
                    paListado.Visible = false;
                    tsbSeleccionar.Enabled = false;
                    tsbNuevo.Enabled = false;
                    tsbEditar.Enabled = false;
                    tsbGuardar.Enabled = true;
                    tsbCancelar.Enabled = true;
                    slFiltrar.Enabled = false;
                    tsbFiltro.Enabled = false;
                }
            }
        }
        #endregion

        #region Metodos
        protected override void OnLoad()
        {   
        }
        protected virtual void OnAddFields(DataGridView listado, ref ucEdicion propiedades)
        {
            MessageBox.Show("Seleccion: OnAddFields()");
        }

        protected virtual void OnLoadData(DataGridView listado)
        {
            MessageBox.Show("Seleccion: OnLoadData()");
        }

        public virtual void OnNavigate(string id, DataGridViewCell cell)
        {
            MessageBox.Show(string.Format("Seleccion: OnNavigate({0}, {1})", id, cell));
        }
        
        #endregion

        #region Eventos
        private void fmSeleccion_Load(object sender, EventArgs e)
        {
            propiedades = new ucEdicion();
            paEdicion.Dock = DockStyle.Fill;
            paListado.Dock = DockStyle.Fill;
            Modo = ModoMantenimiento.Listado;
            if (Process.GetCurrentProcess().ProcessName != "devenv") //#Hack: Problema de visualizacion en Tipo de Diseño
            {
                OnAddFields(listado, ref propiedades);
                listado.AutoGenerateColumns = false;
                OnLoadData(listado);
                propiedades.OnLoadData();
            }
            paEdicion.Controls.Add(propiedades);
            propiedades.Dock = DockStyle.Fill;
        }
        private void listado_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            Seleccionar();
        }
        private void listado_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                e.SuppressKeyPress = true;
        }
        private void listado_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                Seleccionar();
            }
        }
        private string idNavegado;
        private void listado_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            string id = listado.Rows[e.RowIndex].Cells[0].Value + "";
            if (idNavegado != id)
            {
                OnNavigate(id, listado.Rows[e.RowIndex].Cells[0]);
                idNavegado = id;
            }
        }
        private void tsbSeleccionar_Click(object sender, EventArgs e)
        {
            Seleccionar();
        }

        protected void Seleccionar()
        {
            if (listado.Rows.Count > 0)
            {
                this.DialogResult = DialogResult.OK;
                Close();
            }
            else
            {
                MessageBox.Show(this, "No hay registros seleccionados", "Itegracion", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        private void tsbNuevo_Click(object sender, EventArgs e)
        {
            propiedades.Clear();
            propiedades.OnNew();
            Modo = ModoMantenimiento.Nuevo;
        }
        private void tsbEditar_Click(object sender, EventArgs e)
        {
            if (listado.Rows.Count > 0)
            {
                propiedades.OnProperty(listado.SelectedRows[0].Cells[0].Value + "", listado.SelectedRows[0].Cells[0]);
                Modo = ModoMantenimiento.Edicion;
            }
        }
        private void tsbGuardar_Click(object sender, EventArgs e)
        {
            propiedades.ep.Clear();
            object id = null;
            if (Modo == ModoMantenimiento.Edicion)
                id = listado.SelectedRows[0].Cells[0].Value;

            if (propiedades.AreDataValid(Modo))
            {
                propiedades.OnSave(id, Modo);
                OnLoadData(listado);
                //listado.Rows[listado.RowCount - 1].Selected = true;
                Modo = ModoMantenimiento.Listado;
            }
        }
        private void tsbCancelar_Click(object sender, EventArgs e)
        {
            if (Modo == ModoMantenimiento.Listado)
            {
                this.DialogResult = DialogResult.Cancel;
                Close();
            }
            else
                if (MessageBox.Show(this, "No se guardarán los cambios realizados. ¿Desea Continuar?", "Confirmación", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    Modo = ModoMantenimiento.Listado;
                }
        }
        private void fmSeleccion_KeyUp(object sender, KeyEventArgs e)
        {   
            if (e.KeyCode == Keys.N && e.Modifiers == Keys.Control && tsbNuevo.Enabled)
            {
                tsbNuevo_Click(sender, e);
            } 
            if (e.KeyCode == Keys.F2 && tsbEditar.Enabled)
            {
                tsbEditar_Click(sender, e);
            }
            if (e.KeyCode == Keys.G && e.Modifiers == Keys.Control && tsbGuardar.Enabled)
            {
                tsbGuardar_Click(sender, e);
            }
            if (e.KeyCode == Keys.Escape)
            {
                tsbCancelar_Click(sender, e);
            }
        }
        #endregion

        private void fmSeleccion_KeyDown(object sender, KeyEventArgs e)
        {
            if (Char.IsLetterOrDigit(Convert.ToChar(e.KeyValue)) && e.Modifiers != Keys.Control && modo == ModoMantenimiento.Listado)
            {
                if (!tsbFiltro.Focused)
                {
                    tsbFiltro.Text += Convert.ToChar(e.KeyValue);
                    tsbFiltro.Focus();
                    tsbFiltro.SelectionStart = tsbFiltro.Text.Length;
                }
            }
        }

        private void tsbFiltro_TextChanged(object sender, EventArgs e)
        {
            string keys = string.Empty;
            foreach (DataGridViewColumn c in listado.Columns)
            {
                keys += c.DataPropertyName + "+'|'+";
            }
            keys = keys.Substring(0, keys.Length - 5);
            (listado.DataSource as DataTable).DefaultView.RowFilter = string.Format("{0} LIKE '%{1}%'", keys, tsbFiltro.Text);
        }

        private void tsbFiltro_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down)
            {
                listado.Focus();
            }
        }
    }
}
